본문으로 건너뛰기

Ch3. 네이티브

네이티브란?

자주 사용하는 내장 생성자들:

  • String(), Number(), Boolean()
  • Array(), Object(), Function()
  • RegExp(), Date(), Error(), Symbol()

네이티브 = ECMAScript 명세에 정의된 내장 함수
window, document 같은 호스트 객체는 포함되지 않음


3.1 내부 [[Class]]

  • typeof"object"인 값은 [[Class]] 내부 프로퍼티를 가짐
  • Object.prototype.toString.call(obj) 으로 확인 가능
  • null, undefined는 특별히 다르게 처리됨

3.2 래퍼 박싱하기

var str = "abc";
console.log(str.length); // OK
  • 원시값이지만 자동으로 String 객체로 박싱됨
  • 명시적 박싱: new String("abc") → 비추천
  • Boolean 박싱 주의:
var isSuccess = new Boolean(false);
if (!isSuccess) console.log("Error!"); // 출력되지 않음
  • Object로 래핑하는 방법:
var c = Object("abc");

3.3 언박싱

var a = new String("abc");
a.valueOf(); // "abc"
  • 연산 중 자동 언박싱됨
  • "abc" + "def" → 원시값으로 계산

3.4 네이티브, 나는 생성자다

리터럴 vs 생성자

var a = new Array(1, 2, 3);
var b = [1, 2, 3]; // 더 나은 방식

Sparse Array

var a = new Array(3); // [empty x 3]

→ 되도록 사용하지 말자

var a = Array.apply(null, { length: 3 }); // [undefined, undefined, undefined]

Object, Function, RegExp

var o = {};
var f = function(a) { return a * 2; };
var r = /abc/g;
  • Function 생성자는 eval처럼 동작 → 비추천
  • 정규표현식은 리터럴 사용 권장

Date, Error

new Date().getTime();
Date.now();

throw new Error("message");

Symbol

const sym = Symbol("my symbol");
const obj = { [sym]: "foo" };

Object.getOwnPropertySymbols(obj); // [Symbol(my symbol)]
  • new Symbol() 은 에러
  • Symbol.iterator, Symbol.toPrimitive 등 내장 Symbol 존재

3.5 네이티브 프로토타입

  • 각 생성자는 .prototype 객체를 가짐
  • String.prototype, Array.prototype, Function.prototype
  • 프로토타입은 디폴트 값도 제공
function Foo() {}
Foo.prototype.name = "default";
  • 직접 값을 세팅하는 것보다 프로토타입 활용이 메모리 측면에서 이점

정리

  • 자바스크립트는 원시값을 감싸는 네이티브 객체 래퍼를 제공
  • 생성자 사용보다는 리터럴을 사용하는 것이 더 안전
  • new 없이 호출 가능한 생성자도 있음 (Symbol, Date, Error 등 제외)
  • 프로토타입은 객체 간 공유 구조를 만들고 최적화를 돕는다

네이티브 프로토타입을 직접 수정하는 건 위험할 수 있으니 지양하자.